2023/12/232212字符
setState
import React from 'react';
import ReactDOM from 'react-dom';
class MyCopm extends React.Component {
state = {
num: 0
}
handelClick = () => {
this.setState({
num: this.state.num + 1
})
console.log(this.state.num);
}
render () {
console.log('render');
return (<>
<p>{this.state.num}</p>
<button onClick={this.handelClick}>加一</button>
</>)
}
}
ReactDOM.render(<MyCopm/>, document.getElementById('root'));
点击后输出结果:(setState “可能”是异步的)
//--> 0
//--> render
如果改变状态的代码处于某个 HTML 元素的事件中,则其是异步的,否则是同步的
import React from 'react';
import ReactDOM from 'react-dom';
class MyCopm extends React.Component {
state = {
num: 0
}
handelClick = () => {
this.setState({
num: this.state.num + 1
}, () => {
console.log(this.state.num);
})
}
render () {
console.log('render');
return (<>
<p>{this.state.num}</p>
<button onClick={this.handelClick}>加一</button>
</>)
}
}
ReactDOM.render(<MyCopm/>, document.getElementById('root'));
输出结果:
//--> render
//--> 1
同步多次调用 setState
import React from 'react';
import ReactDOM from 'react-dom';
class MyCopm extends React.Component {
state = {
num: 0
}
handelClick = () => {
this.setState(cur => ({
num: cur.num + 1
}));
this.setState(cur => ({
num: cur.num + 1
}));
this.setState(cur => ({
num: cur.num + 1
}));
}
render () {
return (<>
<p>{this.state.num}</p>
<button onClick={this.handelClick}>加一</button>
</>)
}
}
ReactDOM.render(<MyCopm/>, document.getElementById('root'));
React 会对异步的 setState 进行优化,将多次的 setState 合并后再渲染